package city.spring.modules.consumptionItem.service;

import city.spring.modules.consumptionItem.entity.ConsumptionItemsEntity;
import city.spring.modules.consumptionItem.vo.ConsumptionItemsEntityVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Set;

/**
 * Service：收费项目
 *
 * @author pxm
 * @date 2020-08-05 16:18:33
 */
public interface ConsumptionItemsService extends IService<ConsumptionItemsEntity> {
    String CACHE_NAME = "consumption_items";

    /**
     * 业务处理：保存一个 <strong>收费项目</strong>
     *
     * @param entity 收费项目
     */
    void saveConsumptionItems(ConsumptionItemsEntity entity);

    /**
     * 业务处理：修改一个 <strong>收费项目</strong>
     *
     * @param entity 收费项目
     */
    void updateConsumptionItems(ConsumptionItemsEntity entity);

    /**
     * 业务处理：删除一个 <strong>收费项目</strong>
     *
     * @param primaryKey 主键ID
     */
    void deleteConsumptionItems(String primaryKey);

    /**
     * 业务处理：删除多个 <strong>收费项目</strong>
     *
     * @param primaryKeys 主键ID列表
     */
    void deleteConsumptionItems(List<String> primaryKeys);

    /**
     * 根据传入消费项目id，数量，计算，返回总价
     *
     * @param itemId
     * @param quantity
     * @return
     */
    BigDecimal ConsumptionItemsCount(String itemId, Integer quantity);

    /**
     * 把原始数据列表转换成树形结构数据
     *
     * @param rawDatasource 原始数据列表
     * @return 从原始数据列表中转换成树形结构数据
     */
    default List<ConsumptionItemsEntity> converterToTreeDatasource(List<ConsumptionItemsEntity> rawDatasource) {
        return converterToTreeDatasource(rawDatasource, true);
    }

    /**
     * 把原始数据列表转换成树形结构数据
     *
     * @param rawDatasource    原始数据列表
     * @param loadParentEntity 是否加载父级信息：如果处理后的顶级结果中依旧存在父级标识，是否继续加载结果列表中父级信息，建议传入 true ，在搜索的时候有时候只能搜索出子节点，此时可以加载出父节点西悉尼
     * @return 从原始数据列表中转换成树形结构数据
     */
    List<ConsumptionItemsEntity> converterToTreeDatasource(List<ConsumptionItemsEntity> rawDatasource, boolean loadParentEntity);

    /**
     * 获取子级的组织机构ID列表
     *
     * @param parentIds 父级的ID列表
     * @return 子级ID列表
     */
    Set<String> getChildrenIds(Set<String> parentIds);

    /**
     * 查找类别是护理并且不是房间的收费项目,list展示
     */
    List<ConsumptionItemsEntity> getCategoryListByPidAndIsroom(String categoryId);

    /**
     * 根据护理级别id，床位id 查找护理级别下的床位消费项目的信息 获取床位费用
     *
     * @param categoryId
     * @param bedId
     * @return
     */
    ConsumptionItemsEntity getBedFee(String categoryId, String bedId);

    /**
     * 分页获取的类别为增值收费 收费项目列表
     *
     * @param page    分页对象
     * @param wrapper 查询对象
     * @return 消费类别
     */
    IPage<ConsumptionItemsEntityVO> listPage(Page<? extends ConsumptionItemsEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends ConsumptionItemsEntity> wrapper);

}